/-imports
/-storage ...
/-storage/attached ...
AttachedStorage.ts
LocalStorageStorage.ts
/-typings
teapo.html
1
module storage.attached {
2
 
3
  export class LocalStorageStorage implements AttachedStorage {
4
 
5
    constructor(private _localStorage: typeof localStorage) {
6
    }
7
 
8
    getKeys(lead: string, obj: any, callback: (error: Error) => void) {
9
      for (var i = 0; i < this._localStorage.length; i++) {
10
        var key = this._localStorage.key(i);
11
        if (key.length < lead.length) continue;
12
        if (key.slice(0, lead.length) !== lead) continue;
13
 
14
        obj[key] = null;
15
      }
16
      callback(null);
17
    }
18
 
19
    populate(obj: any, callback: (error: Error) => void) {
20
      for (var k in obj) if (obj.hasOwnProperty(k)) {
21
        obj[k] = this._localStorage.getItem(k);
22
      }
23
      callback(null);
24
    }
25
 
26
    update(obj: any, callback: (error: Error) => void) {
27
      for (var k in obj) if (obj.hasOwnProperty(k)) {
28
        var value = obj[k];
29
        if (value === null)
30
          this._localStorage.removeItem(k);
31
        else
32
          this._localStorage.setItem(k, value);
33
      }
34
      callback(null);
35
    }
36
 
37
  }
38
 
39
  export module LocalStorageStorage {
40
 
41
    export function detect(callback: (error: Error, storage: AttachedStorage) => void, windowOverride = window) {
42
 
43
      var localStorage = windowOverride.localStorage;
44
 
45
      if (!localStorage) {
46
        callback(new Error('Browser does not expose localStorage.'), null);
47
        return;
48
      }
49
 
50
      var absentFunctions: string[] = [];
51
      if (!localStorage.getItem) absentFunctions.push('getItem');
52
      if (!localStorage.setItem) absentFunctions.push('setItem');
53
      if (!localStorage.removeItem) absentFunctions.push('removeItem');
54
      
55
      if (absentFunctions.length) {
56
        callback(new Error('Incorrect shape of localStorage (' + absentFunctions.join(', ') + ' ' + (absentFunctions.length == 1 ? 'is' : 'are') + ' absent).'), null);
57
        return;
58
      }
59
 
60
      var storage = new LocalStorageStorage(localStorage);
61
      callback(null, storage);
62
    }
63
 
64
  }
65
 
66
}